package com.genius.reservation.common.BaseDao;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.*;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.List;
import java.util.Objects;

public interface BaseDao<T> extends BaseMapper<T> {
    default LambdaQueryWrapper<T> getQueryWrapper() {
        return Wrappers.lambdaQuery();
    }

    default LambdaUpdateWrapper<T> getUpdateWrapper() {
        return Wrappers.lambdaUpdate();
    }

    default int save(T entity) {
        return this.insert(entity);
    }

    default int update(T entity) {
        return this.updateById(entity);
    }

    default int delete(T entity){
        return this.delete(entity);
    }

//    default int saveOrUpdate(T entity) {
//        if (null != entity) {
//            Class<?> cls = entity.getClass();
//            TableInfo tableInfo = TableInfoHelper.getTableInfo(cls);
//            Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
//            String keyProperty = tableInfo.getKeyProperty();
//            Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
//            Object idVal = ReflectionKit.getFieldValue(entity, tableInfo.getKeyProperty());
//            return StringUtils.checkValNull(idVal) || Objects.isNull(get((Serializable)idVal)) ? save(entity)
//                    : updateById(entity);
//        }
//
//        return -1;
//    }

    default T get(Serializable id) {
        return this.selectById(id);
    }

    default T getByComposeId() {
        return null;
    }

    default List<T> listAll(@Param("ew") Wrapper<T> wrapper) {
        return this.selectList(wrapper);
    }

    default IPage<T> list(IPage<T> page, @Param("ew") Wrapper<T> wrapper) {
        return this.selectPage(page, wrapper);
    }

}
